ETCD组件在grpc中的实践 | 您所在的位置:网站首页 › python etcd3与protobuf不兼容 › ETCD组件在grpc中的实践 |
一、前言 grpc中没有像go-micro那样集成可插拔式的etcd库使用,如何使得grpc能够使用服务注册发现及命名解析的功能,因此本文基于etcd实现了Name Resolver。
二、所需的grpc版本及高版本grpc、protobuf与etcd兼容问题 grpc相关库: google.golang.org/grpc v1.26.0 google.golang.org/grpc/balancer/roundrobin google.golang.org/grpc/resolver
etcd相关库: go.etcd.io/etcd/clientv3 github.com/coreos/etcd/mvcc/mvccpb
此处需要注意的是,新版本grpc不兼容etcd相关库, 如果grpc版本大于1.26.0或者protobuf版本过高会出现以下问题: 1. grpc版本过高,新版本不支持etcd 需降级 # github.com/coreos/etcd/clientv3/balancer/picker ../../vendor/github.com/coreos/etcd/clientv3/balancer/picker/err.go:37:44: undefined: balancer.PickOptions ../../vendor/github.com/coreos/etcd/clientv3/balancer/picker/roundrobin_balanced.go:55:54: undefined: balancer.PickOptions # github.com/coreos/etcd/clientv3/balancer/resolver/endpoint ../../vendor/github.com/coreos/etcd/clientv3/balancer/resolver/endpoint/endpoint.go:114:78: undefined: resolver.BuildOption ../../vendor/github.com/coreos/etcd/clientv3/balancer/resolver/endpoint/endpoint.go:182:31: undefined: resolver.ResolveNowOption解决办法:在go.mod 加入:replace google.golang.org/grpc => google.golang.org/grpc v1.26.0 2. grpc版本过低 protobuf版本过高 # ut-blogger/api/protos/user ../../api/protos/user/user.pb.go:327:11: undefined: grpc.SupportPackageIsVersion6 ../../api/protos/user/user.pb.go:338:5: undefined: grpc.ClientConnInterface解决办法:降级protoc-gen-go的版本 go get github.com/golang/protobuf/[email protected] 重新生成proto
三、自定义实现naming package etcdservice import ( "context" "go.etcd.io/etcd/clientv3" "log" "strings" "time" ) const Schema = "grpcEtcd" // Register 注册地址到ETCD组件中 使用 ; 分割 func Register(etcdAddr, name string, addr string, ttl int64) error { var err error if cli == nil { cli, err = clientv3.New(clientv3.Config{ Endpoints: strings.Split(etcdAddr, ";"), DialTimeout: 15 * time.Second, }) if err != nil { log.Printf("connect to etcd err:%s", err) return err } } ticker := time.NewTicker(time.Second * time.Duration(ttl)) go func() { for { getResp, err := cli.Get(context.Background(), "/"+Schema+"/"+name+"/"+addr) if err != nil { log.Printf("getResp:%+v\n", getResp) log.Printf("Register:%s", err) } else if getResp.Count == 0 { err = withAlive(name, addr, ttl) if err != nil { log.Printf("keep alive:%s", err) } } |
今日新闻 |
推荐新闻 |
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 |